package com.wh.productMag.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import com.wh.productMag.pojo.ProductClassify;
import com.wh.productMag.dao.ProductClassifyMapper;
import com.wh.productMag.service.IProductClassifyService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wh.productMag.dto.ProductClassifyQueryDto;
import org.springframework.util.ObjectUtils;

import java.util.*;

/**
 * 业务实现类
 */
@Service
public class ProductClassifyServiceImpl extends ServiceImpl<ProductClassifyMapper, ProductClassify> implements IProductClassifyService {

    @Autowired
    private ProductClassifyMapper productClassifyMapper;

    @Override
    public IPage<ProductClassify> findByPage(ProductClassifyQueryDto productClassifyQueryDto) {
        //1.创建查询条件
        QueryWrapper<ProductClassify> qw = new QueryWrapper<>();
        //qw.like("xxx",productClassifyQueryDto.getXxx());
        //qw.or();
        //qw.like("xxx",productClassifyQueryDto.getXxx());
        //2.组件分页数据
        IPage<ProductClassify> page = new Page<>(productClassifyQueryDto.getCurrentPage(), productClassifyQueryDto.getPageSize());
        page.setRecords(productClassifyMapper.findByPage(page, qw));
        page.setTotal(productClassifyMapper.selectCount(qw));
        //3.返回
        return page;
    }

    /**
     * 产品分类树  无限极树业务类
     *
     * @return
     */
    @Override
    //@Cacheable(cacheNames ="prod",key = "'tree'")//t添加缓存到redis
    public List<ProductClassify> prodTree() {
        return getProdClassTree();
    }



    private List<ProductClassify> getProdClassTree() {
        //1 一次性查询出所有的数据 放到内存中，使用map 做缓存
        //2 从所有数据中找出第一层级：这就是我们需要返回的数据
        //3  遍历所有部门只要不是第一层级，找自己的上级，并将自己放入上级的children中
        List<ProductClassify> all = productClassifyMapper.selectList(null);
        Map<Long, ProductClassify> map = new HashMap<>();
        for (ProductClassify productClassify : all) {
            map.put(productClassify.getId(),productClassify);
        }
        //返回前端需要的集合数据
        ArrayList<ProductClassify> child = new ArrayList<>();
        for (ProductClassify productClassify : all) {  //遍历结果集合
            if (productClassify.getParentId()==null){ //此时为父级
                child.add(productClassify);
            }else { //不是父类 就添加到顶级的所属儿子中，引用数据类型存储的为内存地址
                //1 获取父id
                Long parentId = productClassify.getParentId();
                //2 通过父id 找到顶级数据
                ProductClassify parentClassify = map.get(parentId);
                //3 存储
//                if (parentClassify !=null){  //防止空指针，过滤出错误
                    //将自己撞到父类的children中
                    parentClassify.getChildren().add(productClassify);

            }
        }
        return child;

//
//        List<ProductClassify> productClassifies =new ArrayList<>();
//        HashMap<Long, ProductClassify> hashMap = new HashMap<>();
//        List<ProductClassify> productClassify = productClassifyMapper.findAllProductClassify();
//        if (!ObjectUtils.isEmpty(productClassify)) {
//            for (ProductClassify classify : productClassify) {
//                hashMap.put(classify.getId(), classify);
//            }
//            for (Long id : hashMap.keySet()) {
//                List<ProductClassify> classifies = productClassifyMapper.findProductClassifyByParentId(id);
//                //获取当前id的分类对象
//                ProductClassify classify = hashMap.get(id);
//                //将查询出的下级list数据存放到一级对象的children中
//                classify.setChildren(classifies);
//                productClassifies.add(classify);
//            }
//        }
//        return productClassifies;
    }
}
